all : main

# the c source files are in  the parent fold
# 如果把注释写在赋值语句后面，注意"空格"！，会导致路径出错！
outfold := ../

# main所在的c源文件名称,在makefile中，变量赋值不要加引号！！！
mainc := main.c
nullstring := #这里有一个空格

#保证了列表的第一项是main.c
sources := $(wildcard $(outfold)*.c)
sources := $(notdir $(sources))
sources := $(subst $(mainc),$(nullstring),$(sources))
sources := $(strip $(mainc) $(sources))

#如果没有上面的处理，此时并不能保证main在第一项
objs := $(sources:.c=.o)

# 注意，列表的第一项必须是包括Main的文件！
# 有了前面对sources的处理，这个就不需要手写了
#objs := main.o file.o insert.o

CC = gcc

INCLUDE = .

CFLAGS = -g -Wall

#-----------------------------------------------

main : $(objs)
	gcc -o $@ $^

%.d: $(outfold)%.c
	@set -e;rm -f $@;\
	$(CC) -MM $(CFLAGS) $< > $@.$$$$; \
	sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
	rm -f $@.$$$$
include $(objs:.o=.d)

# 如果这个不写，用默认的规则无法找到上层目录中的C源码
%.o : $(outfold)%.c
	$(CC) -I$(INCLUDE) $(CFLAGS) -c $< -o $@


.PHNOY:all clean print

clean:
	@echo "start clean the project..."
	-rm -rf main *.o *.d
	@echo "clean finished!"

print:
#@echo $(findstring main.c,$(sources))
	@echo $(sources)
	@echo $(objs)
#@echo $(objs:.o=.d)
